/**
 * 文件缓冲区 https://www.bilibili.com/video/BV1vs411n7TH?p=126
 * ANSI C 标准采用“缓冲文件系统”处理数据文件。
 * 缓冲文件系统: 系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,
 *             从内存向磁盘输出数据必须先送到内存中的缓冲区，装满缓冲区后才一起送到磁盘去。
 *    如果从磁盘向计算机读入数据，则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区)，
 * 然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。
 */
#include "../Utils/FileIOUtils.h"

static char *FILE_READ_PATH = "../Read_Write_Test/11.文件缓冲区.java";
FILE *file;

static void exam1_scanf();
static void exam2_crash();

int main() {
    file = file_open_w_plus(FILE_READ_PATH);

    //1.scanf输入测试
//    exam1_scanf();
    //2.崩溃测试, 汉字会变成乱码
    exam2_crash();

    file_close(file);
    return EXIT_SUCCESS;
}

//1.scanf输入测试
static void exam1_scanf() {
    printf("1.输入@停止输入.\n");
    char c;
    while (1) {
        scanf("%c", &c);
        if (c == '@') break;
        file_putc(c, file);

        //缓冲区没写满的时候, 不会同步到硬盘.
        // 刷新缓存, 会立即同步到硬盘
        file_flush(file);
    }
}

//2.崩溃测试, 汉字会变成乱码
static void exam2_crash() {
    char c;
    char *str = "jfisf就斯蒂芬浪费\n"
                "sdf s飞sf sfd sd\n"
                "fs飞\n"
                "撒z地方\n"
                "收到\n";
    while (c = *str) {
        //制造崩溃
        if (c == 'z') {
            //直接写 c/0; 代码会被优化掉???...
            int i = c / 0;
        }
        int rec = file_putc(c, file);
        //刷新缓冲区
        file_flush(file);
        str++;
    }
}